var JqGridHelp = {

        csrfSafeMethod: function (method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        },

        sameOrigin: function (url) {
            // test that a given url is a same-origin URL
            // url could be relative or scheme relative or absolute
            var host = document.location.host; // host + port
            var protocol = document.location.protocol;
            var sr_origin = '//' + host;
            var origin = protocol + sr_origin;
            // Allow absolute or scheme relative URLs to same origin
            return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
                (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
                // or any other URL that isn't scheme relative or absolute i.e relative.
                !(/^(\/\/|http:|https:).*/.test(url));
        },

        getCookie: function (name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        },

        // 设置开关按钮样式
        aceSwitch: function (cellvalue, options, cell) {
            setTimeout(function () {
                $(cell).find('input[type=checkbox]')
                    .addClass('ace ace-switch ace-switch-5')
                    .after('<span class="lbl"></span>');
            }, 0);


        },

        //设置为选择日期控件
        pickDate: function (cellvalue, options, cell) {
            setTimeout(function () {
                $(cell).find('input[type=text]').datepicker({format: 'yyyy-mm-dd', autoclose: true});
            }, 0);
        },


        // 查找配置中的列模型数据
        findColModel: function (grid_config, name) {
            for (var i = 0; i < grid_config.colModel.length; i++) {
                if (grid_config.colModel[i].name === name) {
                    return grid_config.colModel[i];
                }
            }
            return null;
        },

        // 更新列配置
        updateColModel: function (grid_config, name, conf) {
            var colModel = JqGridHelp.findColModel(grid_config, name)
            if (colModel == null) {
                return;
            }
            jsonCopyA2B(conf, colModel);
        },

        setFormFieldAsSwitch: function (form, field) {
            form.find('input[name=' + field + ']').addClass('ace ace-switch ace-switch-5').wrap('<label class="inline" />').after('<span class="lbl"></span>');
        },

        setFormFieldAsDatePicker: function (form, field) {
            form.find('input[name=' + field + ']').datepicker({format: 'yyyy-mm-dd', autoclose: true});
        },

        style_edit_form: function (form, style_edit_form_field_func) {
            //enable datepicker on "sdate" field and switches for "stock" field
            //form.find('input[name=date_joined]').datepicker({format: 'yyyy-mm-dd', autoclose: true});
            //form.find('input[name=last_login]').datepicker({format: 'yyyy-mm-dd', autoclose: true});
            //don't wrap inside a label element, the checkbox value won't be submitted (POST'ed)
            //.addClass('ace ace-switch ace-switch-5').wrap('<label class="inline" />').after('<span class="lbl"></span>');
            // 设置特殊字段的验收
            if (style_edit_form_field_func) {
                style_edit_form_field_func(form)
            }

            // 更新按钮样式
            var buttons = form.next().find('.EditButton .fm-button');
            buttons.addClass('btn btn-sm').find('[class*="-icon"]').hide();//ui-icon, s-icon
            buttons.eq(0).addClass('btn-primary').prepend('<i class="ace-icon fa fa-check"></i>');
            buttons.eq(1).prepend('<i class="ace-icon fa fa-times"></i>');

            buttons = form.next().find('.navButton a');
            buttons.find('.ui-icon').hide();
            buttons.eq(0).append('<i class="ace-icon fa fa-chevron-left"></i>');
            buttons.eq(1).append('<i class="ace-icon fa fa-chevron-right"></i>');
        },

        style_delete_form: function (form) {
            var buttons = form.next().find('.EditButton .fm-button');
            buttons.addClass('btn btn-sm btn-white btn-round').find('[class*="-icon"]').hide();//ui-icon, s-icon
            buttons.eq(0).addClass('btn-danger').prepend('<i class="ace-icon fa fa-trash-o"></i>');
            buttons.eq(1).addClass('btn-default').prepend('<i class="ace-icon fa fa-times"></i>')
        },

        style_search_filters: function (form) {
            form.find('.delete-rule').val('X');
            form.find('.add-rule').addClass('btn btn-xs btn-primary');
            form.find('.add-group').addClass('btn btn-xs btn-success');
            form.find('.delete-group').addClass('btn btn-xs btn-danger');
        },

        style_search_form: function (form) {
            var dialog = form.closest('.ui-jqdialog');
            var buttons = dialog.find('.EditTable');
            buttons.find('.EditButton a[id*="_reset"]').addClass('btn btn-sm btn-info').find('.ui-icon').attr('class', 'ace-icon fa fa-retweet');
            buttons.find('.EditButton a[id*="_query"]').addClass('btn btn-sm btn-inverse').find('.ui-icon').attr('class', 'ace-icon fa fa-comment-o');
            buttons.find('.EditButton a[id*="_search"]').addClass('btn btn-sm btn-purple').find('.ui-icon').attr('class', 'ace-icon fa fa-search');
        },

        beforeDeleteCallback: function (e) {
            var form = $(e[0]);
            if (form.data('styled'))
                return false;
            form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />')
            JqGridHelp.style_delete_form(form);
            form.data('styled', true);
        },

        beforeEditCallback: function (e) {
            var form = $(e[0]);
            form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />')
            JqGridHelp.style_edit_form(form);
        },


        //it causes some flicker when reloading or navigating grid
        //it may be possible to have some custom formatter to do this as the grid is being created to prevent this
        //or go back to default browser checkbox styles for the grid
        styleCheckbox: function (table) {
            $(table).find('input:checkbox').addClass('ace')
                .wrap('<label />')
                .after('<span class="lbl align-top" />');

            $('.ui-jqgrid-labels th[id*="_cb"]:first-child')
                .find('input.cbox[type=checkbox]').addClass('ace')
                .wrap('<label />').after('<span class="lbl align-top" />');
        },

        //unlike navButtons icons, action icons in rows seem to be hard-coded
        //you can change them like this in here if you want
        updateActionIcons: function (table) {
            var replacement =
            {
                'ui-ace-icon fa fa-pencil': 'ace-icon fa fa-pencil blue',
                'ui-ace-icon fa fa-trash-o': 'ace-icon fa fa-trash-o red',
                'ui-icon-disk': 'ace-icon fa fa-check green',
                'ui-icon-cancel': 'ace-icon fa fa-times red'
            };
            $(table).find('.ui-pg-div span.ui-icon').each(function () {
                var icon = $(this);
                var $class = $.trim(icon.attr('class').replace('ui-icon', ''));
                if ($class in replacement) icon.attr('class', 'ui-icon ' + replacement[$class]);
            })
        },

        //replace icons with FontAwesome icons like above
        updatePagerIcons: function (table) {
            var replacement =
            {
                'ui-icon-seek-first': 'ace-icon fa fa-angle-double-left bigger-140',
                'ui-icon-seek-prev': 'ace-icon fa fa-angle-left bigger-140',
                'ui-icon-seek-next': 'ace-icon fa fa-angle-right bigger-140',
                'ui-icon-seek-end': 'ace-icon fa fa-angle-double-right bigger-140'
            };
            $('.ui-pg-table:not(.navtable) > tbody > tr > .ui-pg-button > .ui-icon').each(function () {
                var icon = $(this);
                var $class = $.trim(icon.attr('class').replace('ui-icon', ''));

                if ($class in replacement) icon.attr('class', 'ui-icon ' + replacement[$class]);
            })
        },

        enableTooltips: function (table) {
            $('.navtable .ui-pg-button').tooltip({container: 'body'});
            $(table).find('.ui-pg-div').tooltip({container: 'body'});
        },

        // 获取选择的行数
        //var selr = jQuery(grid_selector).jqGrid('getGridParam','selrow');


        // 创建新对象
        createNew: function (grid_selector, pager_selector, grid_config, style_edit_form_field_func, navBtnConfig) {
            var jqGridHelp = {};

            jqGridHelp.grid_selector = grid_selector;
            jqGridHelp.pager_selector = pager_selector;
            jqGridHelp.parent_column = $(grid_selector).closest('[class*="col-"]');

            jqGridHelp.grid_config = grid_config;
            jqGridHelp.style_edit_form_field_func = style_edit_form_field_func;

            jqGridHelp.csrftoken = JqGridHelp.getCookie('csrftoken');

            if (navBtnConfig == null || navBtnConfig == undefined) {
                navBtnConfig = {edit: false, add: false, del: false, search: true, refresh: true, view: false};
            }


            $.ajaxSetup({
                beforeSend: function (xhr, settings) {
                    if (!JqGridHelp.csrfSafeMethod(settings.type) && JqGridHelp.sameOrigin(settings.url)) {
                        xhr.setRequestHeader("X-CSRFToken", jqGridHelp.csrftoken);
                    }
                }
            });

            grid_config.loadComplete = function () {
                var table = this;
                setTimeout(function () {
                    JqGridHelp.styleCheckbox(table);
                    JqGridHelp.updateActionIcons(table);
                    JqGridHelp.updatePagerIcons(table);
                    JqGridHelp.enableTooltips(table);
                }, 0);
            };


            // 重新设置宽度
            $(window).on('resize.jqGrid', function () {
                $(grid_selector).jqGrid('setGridWidth', jqGridHelp.parent_column.width());
            });

            //resize on sidebar collapse/expand
            $(document).on('settings.ace.jqGrid', function (ev, event_name, collapsed) {
                if (event_name === 'sidebar_collapsed' || event_name === 'main_container_fixed') {
                    //setTimeout is for webkit only to give time for DOM changes and then redraw!!!
                    setTimeout(function () {
                        $(grid_selector).jqGrid('setGridWidth', jqGridHelp.parent_column.width());
                    }, 0);
                }
            });

            // 初始化jqGrid表格
            jqGridHelp.jqGrid = $(grid_selector).jqGrid(grid_config);

            $(window).triggerHandler('resize.jqGrid');//trigger window resize to make the grid get the correct size

            // // 初始化过滤工具栏
            // $(grid_selector).jqGrid('filterToolbar', {searchOperators: true, defaultSearch: false, stringResult: true});
            // $(grid_selector).filterToolbar({});

            //初始化导航栏
            $(grid_selector).jqGrid('navGrid', pager_selector,
                { //导航栏
                    edit: navBtnConfig.edit,
                    editicon: 'ace-icon fa fa-pencil blue',
                    add: navBtnConfig.add,
                    addicon: 'ace-icon fa fa-plus-circle purple',
                    del: navBtnConfig.del,
                    delicon: 'ace-icon fa fa-trash-o red',
                    search: navBtnConfig.search,
                    searchicon: 'ace-icon fa fa-search orange',
                    refresh: navBtnConfig.refresh,
                    refreshicon: 'ace-icon fa fa-refresh green',
                    view: navBtnConfig.view,
                    viewicon: 'ace-icon fa fa-search-plus grey'
                },
                {
                    //编辑表单
                    closeAfterEdit: true,
                    //width: 700,
                    recreateForm: true,
                    beforeShowForm: function (e) {
                        var form = $(e[0]);
                        form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />')
                        JqGridHelp.style_edit_form(form, style_edit_form_field_func);
                    }
                },
                {
                    //添加表单
                    //width: 700,
                    closeAfterAdd: true,
                    recreateForm: true,
                    viewPagerButtons: false,
                    beforeShowForm: function (e) {
                        var form = $(e[0]);
                        form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />')
                        JqGridHelp.style_edit_form(form, style_edit_form_field_func);
                    }
                },
                {
                    //删除表单
                    recreateForm: true,
                    beforeShowForm: function (e) {
                        var form = $(e[0]);
                        if (form.data('styled'))
                            return false;

                        form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />');
                        JqGridHelp.style_delete_form(form);

                        form.data('styled', true);
                    },

                    onClick: function (e) {
                        //alert(1);
                    }
                },
                {
                    //搜索表单
                    recreateForm: true,
                    afterShowSearch: function (e) {
                        var form = $(e[0]);
                        form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class="widget-header" />');
                        JqGridHelp.style_search_form(form);
                    },
                    afterRedraw: function () {
                        JqGridHelp.style_search_filters($(this));
                    },
                    multipleSearch: true,
                    //multipleGroup: true,
                    //showQuery: true
                },
                {
                    //view record form
                    recreateForm: true,
                    beforeShowForm: function (e) {
                        var form = $(e[0]);
                        form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class="widget-header" />');
                    }
                }
            );

            $(document).one('ajaxloadstart.page', function (e) {
                $.jgrid.gridDestroy(grid_selector);
                $('.ui-jqdialog').remove();
            });

            return jqGridHelp;
        }
    }
    ;

